perm filename TLKEF2.FAI[AL,HE] blob
sn#317735 filedate 1977-11-15 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00005 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE TLKEF2
C00006 00003 START OF EXECUTABLE CODE
C00009 00004 [CONTINUATION OF "TLKEF2"]
C00012 00005 [LOCAL STORAGE AREA]
C00015 ENDMK
C⊗;
TITLE TLKEF2
INTERNAL TLKEF2
;"TLKEF2" IS A SAIL CALLABLE PROCEDURE FOR SENDING A COMMAND INSTRUCTION
;BLOCK FROM THE PDP10 TO THE PDP11. THE INSTRUCTION BLOCK CONTAINS THE
;INFORMATION NECESSARY TO DRIVE ONE ARM JOINT. IN ADDITION, DIAGNOSTIC
;DATA IS COLLECTED FROM THE ELF AND RETURNED TO THE CALLING PROGRAM
;BEFORE EXITING. A SAMPLE SAIL CALL FOLLOWS:
;
; STAT←TLKEF2(ARM,JOINT,DURA,ANGLE1,ANGLE2,MASTER,DATA);
;WHERE
; STAT = 0 → MOVEMENT INITIATED, 1 INDICATES FAILURE, <0 JT STATUS WD
; ARM = 0 FOR YELLOW ARM, 1 FOR BLUE
; JOINT = 0 TO 6
; DURA = 1 TO 32000, DURATION OF MOTOR DRIVE IN MILLISECONDS
; MASTER= CHECK WORD TO ELF TO INSURE THIS IS A LEGAL INSTRUCTION
; DATA = ARRAY TO RETURN DYNAMIC RESPONSE DATA
; ANGLE = CHANGE IN JT ANGLE CONVERTED TO TWO WDS OF PDP11 F.P.
;
;TLKELF EXPECTS THE "ARM" VALUE IN THE ELF TO BE NEGATIVE INDICATING THAT THE
;ELF IS PREPARED TO RECEIVE A COMMAND BLOCK. IF "ARM" IS NOT NEGATIVE AN ERROR
;MESSAGE IS TYPED AND TLKELF EXITS TO THE CALLING PROGRAM. AFTER PASSING THE
;CONTROL BLOCK, TLKELF GOES INTO A WAIT LOOP LOOKING FOR "ARM" TO GO NEGATIVE
;IN THE ELF INDICATING THAT THE ARM MOTION IS COMPLETED. IF TLKELF IS IN A WAIT
;LOOP FOR OVER 60 SECONDS, AN ERROR MESSAGE IS TYPED. IF THE "ELF" COMPLETES
;A MOTION SUCCESSFULLY, THE ARRAY DATA IS FILLED WITH DIAGNOSTIC DATA FROM THE
;ELF "DBUF" AREA. AFTER EXECUTION OF TLKEF2, THE ELF IS LEFT IN A WAIT LOOP
;LOOKING FOR ANOTHER COMMAND BLOCK.
;DEFINITIONS
P←17 ;PUSH STACK REGISTER
CMDADD←44000 ;COMMAND BUFFER (WORD) ADDRESS IN ELF
CMDSTT←44006 ;JOINT STATUS WORD AFTER EXECUTION OF FUNCTION
DBUFL←=3601 ;NUMBER OF WORDS IN DIAGNOSTIC DATA BUFFER
;START OF EXECUTABLE CODE
TLKEF2: MOVEM 16,HOLD+14 ;SAVE THE REGISTERS
MOVE 16,[XWD 2,HOLD]
BLT 16,HOLD+13
MOVE 1,P ;GET THE ADDRESS OF THE STACK
SUBI 1,=7 ;GET THE ADDRESS OF "ARM" NUMBER
HRLZ 1,1 ;PREPARE TO BLT INTO LOCAL ARRAY
HRRI 1,CMDARR ;STORE ARGUMENTS IN CMDARR
BLT 1,CMDARR+6 ;TRANSFER ARGUMENTS
SOS 2,DATA ;DECREMENT ARRAY POINTER
HRLI 2,-DBUFL ;SET POINTER TO TRANSFER DIAGNOSTIC DATA
MOVEM 2,INLST
IOPUSH 1, ;CALLER MIGHT WANT THIS CHANNEL
JRST [ OUTSTR CM0 ;IOPDLOV MESSAGE
JRST ERR ]
INIT 1,17 ;INITIALIZE THE ELF
SIXBIT /ELF/
0
JRST [ OUTSTR CM1 ;ERROR RETURN
ERR: MOVEI 1,1 ;RETURN ERROR VALUE
JRST TLKDNE ]
GETSTS 1,1 ;GET THE ELF STATUS WORD
TRNE 1,777700 ;CHECK FOR ERROR CONDITION
JRST [ OUTSTR CM2 ;INDICATE STATUS ERROR
JRST ERR ]
;CHECK IF ELF IS READY TO RECEIVE A COMMAND BLOCK
MTAPE 1,ARMADD ;GET THE VALUE OF "ARM" WORD IN ELF
JRST [ OUTSTR CM3 ;ERROR RETURN
JRST ERR ]
MOVE 2,ARM ;LOAD VALUE INTO REGISTER
JUMPGE 2,[ OUTSTR CM4 ;ELF NOT READY FOR COMMAND IF ARM GE 0
JRST ERR ]
;SEND COMMAND BLOCK TO "ELF"
USETO 1,CMDMDE ;SET UP OUTPUT OF COMMAND BLOCK
OUT 1,OUTLST ;SEND THE COMMAND LIST TO THE ELF
JRST .+2 ;NORMAL RETURN
JRST [ OUTSTR CM5 ;ERROR RETURN
JRST ERR ]
;GO INTO WAIT LOOP UNTIL TASK DONE
MOVEI =20 ;SET WAIT LOOP COUNT
MOVEM CNT
SLEP: MOVEI 2,1 ;SET PROGRAM TO SLEEP FOR 1 SECOND
SLEEP 2,
; [CONTINUATION OF "TLKEF2"]
MTAPE 1,ARMADD ;GET THE VALUE OF "ARM" WORD IN ELF
JRST [ OUTSTR COM6 ;ERROR RETURN
JRST ERR ]
MOVN 1,ARM ;LOAD VALUE INTO REGISTER
JUMPG 1,DVEDNE ;IF "ARM" VALUE NEGATIVE, BRANCH, MOTOR DRIVE DONE
SOSE CNT ;SKIP IF ELF TAKES TOO MUCH TIME
JRST SLEP ;ELSE GO SLEEP AGAIN
OUTSTR COM7 ;TELL OPERATOR, ELF TOOK TOO MUCH TIME
JRST ERR
;MOTOR DRIVE FUNCTION COMPLETED. COLLECT RESPONSE DATA
DVEDNE: CAIN 1,2 ;CHECK IF ERROR CODE TWO RETURNED
JRST [ OUTSTR COM9 ;TYPE MASTER NUMBER ERROR
JRST ERR ]
OR 1,[400004,,400000] ;ADD TRANSFER MODE BITS
MOVEM 1,DYNA
USETI 1,DYNA ;SET UP INPUT OF D.R. DATA BLOCKS
IN 1,INLST ;READ IN A BLOCK OF DATA
JRST .+2 ;NORMAL RETURN
JRST [ OUTSTR COM8 ;ERROR RETURN
JRST ERR ]
;READ IN THE JOINT STATUS WORD
MTAPE 1,STTADD ;GET THE VALUE OF "STATUS" WORD IN ELF
JRST [ OUTSTR COM10 ;ERROR RETURN
JRST ERR ]
MOVN 1,ARMSTT ;RETURN THE ARM STATUS
;RETURN TO CALLING PROGRAM
TLKDNE: IOPOP 1, ;RELEASE THE ELF & RESTORE CHANNEL 1
JFCL ;JUST CANNOT HAPPEN
MOVE 16,[XWD HOLD,2] ;RESTORE THE REGISTERS
BLT 16,15
MOVE 16,HOLD+14
SUB P,[10(10)] ;POP ARGUMENTS OFF STACK
JRST @10(P) ;RETURN
;END OF "TLKEF2"
; [LOCAL STORAGE AREA]
CNT: 0
HOLD: BLOCK 15
INBUF: BLOCK 3
;COMMAND DATA BLOCK
CMDARR: 0 ;YELLOW OR BLUE ARM
0 ;JOINT
0 ;MOTION DURATION
0 ;CHANGE IN JOINT ANGLE
0
0 ;MASTER NUMBER
DATA: 0 ;ADDRESS OF DYNAMIC RESPONSE DATA ARRAY
;I/O DATA AREAS
ARMADD: 002004,,CMDADD ;MODE AND ADDRESS FOR COMMAND OUTPUT STRING
ARM: 0 ;VALUE OF "ARM" LOCATION IN ELF
STTADD: 002004,,CMDSTT ;MODE AND ADDRESS FOR ARM STATUS WORD IN ELF
ARMSTT: 0
DYNA: 400004,,400000 ;MODE AND ADDRESS FOR "IN" OF DYNAMIC RESPONSE DATA
CMDMDE: 400004,,400000+CMDADD ;MODE AND ADDRESS FOR COMMAND OUTPUT STRING
OUTLST: IOWD 6,CMDARR ;OUT COMMAND LIST
0
INLST: IOWD DBUFL,INBUF ;DYNAMIC RESPONSE INPUT LIST
0
;OUTPUT STRINGS
CM0: ASCIZ/IOPDLOV WHEN TRY TO SAVE CHANNEL 1 FOR "ELF"
/
CM1: ASCIZ/CANNOT INIT "ELF"
/
CM2: ASCIZ/"ELF" STATUS WORD INDICATES ERROR CONDITION
/
CM3: ASCIZ/READING OF "ELF" READY FLAG FAILED
/
CM4: ASCIZ/"ELF" NOT READY FOR ARM COMMAND
/
CM5: ASCIZ/BAD TRANSFER OF COMMAND LIST TO "ELF"
/
COM6: ASCIZ/BAD READ FROM "ELF" DURING MOTOR DRIVE WAIT LOOP
/
COM7: ASCIZ/MOTOR DRIVE TOOK TOO LONG TO EXECUTE
/
COM8: ASCIZ/BAD READ FROM "ELF" DURING DIAGNOSTICS DATA TRANSFER
/
COM9: ASCIZ/WRONG MASTER NUMBER SENT TO "ELF"
/
COM10: ASCIZ/BAD READ FROM "ELF" DURING JOINT STATUS WORD TRANSFER
/
END